package com.no1.musicmgr.controller;

import com.no1.musicmgr.entity.Music;
import com.no1.musicmgr.entity.User;
import com.no1.musicmgr.service.MusicService;
import com.no1.musicmgr.service.UserService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.Resource;
import org.springframework.core.io.UrlResource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

/**
 * MusicSrcController 类用于处理前端请求并提供音乐文件的访问。
 */
@RestController
public class MusicSrcController {

    @Autowired
    private MusicService musicService;

    // 定义音乐文件所在的文件夹名称
    private static final String MUSIC_FOLDER = "C:/static/musics/src";
    // 定义音乐歌词文件所在文件夹名称
    private static final String LYRICS_FOLDER = "C:/static/musics/lrc";
    // 定义音乐封面文件所在文件夹名称
    private static final String IMAGES_FOLDER = "C:/static/musics/image";
    @Autowired
    private UserService userService;

    /**
     * 处理前端发送的 GET 请求来播放音乐文件。
     *
     * @param filename,lrcname,imgname 音乐文件的名称
     * @return 音乐文件的资源路径
     */
    @Operation(summary = "音乐信息")
    @Parameters({
            @Parameter(name = "filename", description = "音乐文件名"),
            @Parameter(name = "lrcname", description = "音乐歌词名"),
            @Parameter(name = "imgname", description = "音乐封面名")
    })
    @GetMapping("/resource")
    public Music playMusic(String filename,String lrcname,String imgname) throws IOException {

        // 创建music对象存储音乐信息
        Music music = new Music();

        // 判断前端传来的字符是否为空
        if (filename == null || filename.isEmpty()) {
            return music;
        }
        if (lrcname == null || lrcname.isEmpty()) {
            return music;
        }
        if (imgname == null || imgname.isEmpty()) {
            return music;
        }

        // 获取音乐文件的完整路径
        Path filePath = Paths.get(MUSIC_FOLDER, filename);  // 结果为：MUSIC_FOLDER/{filename}
        Path lrcPath = Paths.get(LYRICS_FOLDER, lrcname);
        Path imgPath = Paths.get(IMAGES_FOLDER, imgname);

        // 检查文件夹是否存在，如果不存在则创建
//        if (!Files.exists(filePath.getParent())) {
//            Files.createDirectories(filePath.getParent());
//        }
//        if (!Files.exists(lrcPath.getParent())) {
//            Files.createDirectories(lrcPath.getParent());
//        }
//        if (!Files.exists(imgPath.getParent())) {
//            Files.createDirectories(imgPath.getParent());
//        }

        // 将文件路径转换为 Resource 对象
        Resource resource = new UrlResource(filePath.toUri());
        Resource lrcResource = new UrlResource(lrcPath.toUri());
        Resource imgResource = new UrlResource(imgPath.toUri());
        System.out.println(resource + " " + lrcResource + " " + imgResource);
        // 创建音乐文件的资源路径
        String resourceUrl = "/src/musics/src/" + filename;
        String lrcResourceUrl = "/src/musics/lrc/" + lrcname;
        String imgResourceUrl = "/src/musics/image/" + imgname;

        // 检查文件是否存在且可读
        if (resource.exists() && Files.isReadable(filePath)) {
            // 将音乐信息保存到music中
            music.setMusic_url(resourceUrl);
        } else {
            // 如果文件不存在或不可读，则返回空字符串
            return music;
        }

        // 检查歌词文件是否存在且可读
        if (lrcResource.exists() && Files.isReadable(lrcPath)) {
            // 将音乐信息保存到music中
            music.setMusic_gc(lrcResourceUrl);
        } else {
            // 如果歌词文件不存在或不可读，则返回空字符串
            return music;
        }

        // 检查封面文件是否存在且可读
        if (imgResource.exists() && Files.isReadable(imgPath)) {
            // 返回歌词文件的资源路径
            music.setMusic_img(imgResourceUrl);
        } else {
            // 如果歌词文件不存在或不可读，则返回空字符串
            return music;
        }
        return music;
    }
    @Operation(summary = "音乐文件上传")
    @Parameter(name = "file", description = "音乐文件")
    @PostMapping("/resource/src")
    public String upload (MultipartFile file) {
        // 创建音乐文件名存储传来的音乐文件名
        String fileName = null;
        // 判断音乐文件是否为空
        if (!file.isEmpty()) {
            // 获取音乐文件名
            fileName = file.getOriginalFilename();
            // 获取音乐文件存储路径
            Path uploadPath = Paths.get(MUSIC_FOLDER);
            // 如果路径不存在，则创建目录
            if (!Files.exists(uploadPath)) {
                try {
                    Files.createDirectories(uploadPath);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            //将音乐文件保存到指定路径
            try {
                file.transferTo(uploadPath.resolve(fileName).toFile());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        // 返回文件名
        return fileName;
    }
    @Operation(summary = "音乐歌词上传")
    @Parameter(name = "file", description = "音乐歌词文件")
    @PostMapping("/resource/lrc")
    public String uploadLrc (MultipartFile file) {
        // 创建音乐歌词文件名存储传来的音乐歌词文件名
        String fileName = null;
        // 判断音乐歌词文件是否为空
        if (!file.isEmpty()) {
            // 获取音乐歌词文件名
            fileName = file.getOriginalFilename();
            // 获取音乐歌词文件存储路径
            Path uploadPath = Paths.get(LYRICS_FOLDER);
            // 如果路径不存在，则创建目录
            if (!Files.exists(uploadPath)) {
                try {
                    Files.createDirectories(uploadPath);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            try {
                file.transferTo(uploadPath.resolve(fileName).toFile());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return fileName;
    }
    @Operation(summary = "音乐封面上传")
    @Parameter(name = "file", description = "音乐封面文件")
    @PostMapping("/resource/img")
    public String uploadImg (MultipartFile file) {
        // 创建音乐封面文件名存储传来的音乐封面文件名
        String fileName = null;
        // 判断音乐封面文件是否为空
        if (!file.isEmpty()) {
            // 获取音乐封面文件名
            fileName = file.getOriginalFilename();
            // 获取音乐封面文件存储路径
            Path uploadPath = Paths.get(IMAGES_FOLDER);
            // 如果路径不存在，则创建目录
            if (!Files.exists(uploadPath)) {
                try {
                    Files.createDirectories(uploadPath);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            try {
                file.transferTo(uploadPath.resolve(fileName).toFile());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return fileName;
    }
    @Operation(summary = "音乐下载")
    @Parameters({
            @Parameter(name = "fileName", description = "音乐文件名"),
            @Parameter(name = "music_id", description = "音乐编号")
    })
    @GetMapping("/resource/download")
    public String downloadMusic(String filename,String user_id ) {
        // 创建音乐下载链接
        String resourceUrl = null;
        // 判断Music_id是否为空
        if (user_id != null) {
            // 拼接资源路径
            resourceUrl = "/src/musics/src/" + filename;
        } else {
            return null;
        }
        return resourceUrl;
    }

    @Operation(summary = "获取数据库音乐信息")
    @Parameter(name = "music_id", description = "音乐编号")
    @GetMapping("/resource/message")
    public Music getMusicMessage(Integer music_id) {
        return musicService.selectMusicById(music_id);
    }
}
